home *** CD-ROM | disk | FTP | other *** search
/ Aminet 43 / Aminet 43 (2001)(GTI - Schatztruhe)[!][Jun 2001].iso / Aminet / dev / moni / SystemViewer.lha / Source / SysVectors.c < prev   
Encoding:
C/C++ Source or Header  |  2000-09-24  |  15.2 KB  |  640 lines

  1. /****h *SysVectors/SysVectors.c **************************************
  2. **
  3. ** NAME
  4. **    SysVectors.c
  5. **
  6. ** DESCRIPTION
  7. **    Display the following info from ExecBase:
  8. **
  9. **      ->SoftVer;
  10. **      ->ColdCapture;
  11. **      ->CoolCapture;
  12. **      ->WarmCapture;
  13. **      ->DebugEntry;
  14. **      ->DebugData;
  15. **      ->TaskTrapCode;
  16. **      ->TaskExceptCode;
  17. **      ->KickMemPtr;
  18. **      ->KickTagPtr;
  19. **      ->KickCheckSum;
  20. **
  21. ** FUNCTIONAL INTERFACE:
  22. **    PUBLIC int ShowVectors( void );
  23. **
  24. **********************************************************************
  25. */
  26.  
  27. #include <string.h>
  28.  
  29. #include <exec/types.h>
  30. #include <exec/execbase.h>
  31.  
  32. #include <intuition/intuition.h>
  33. #include <intuition/classes.h>
  34. #include <intuition/classusr.h>
  35. #include <intuition/gadgetclass.h>
  36.  
  37. #include <libraries/gadtools.h>
  38.  
  39. #include <graphics/displayinfo.h>
  40. #include <graphics/gfxbase.h>
  41.  
  42. #include <clib/exec_protos.h>
  43. #include <clib/intuition_protos.h>
  44. #include <clib/gadtools_protos.h>
  45. #include <clib/graphics_protos.h>
  46. #include <clib/utility_protos.h>
  47. #include <clib/diskfont_protos.h>
  48.  
  49. #include "CPGM:GlobalObjects/CommonFuncs.h"
  50.  
  51. #include "SysLists.h"
  52.  
  53. #define VLV     0
  54. #define Clear   1
  55. #define Cancel  2
  56.  
  57. #define Vec_CNT 3
  58.  
  59. IMPORT struct ExecBase *SysBase; // setup by SAS-C.
  60. IMPORT struct Screen   *Scr;
  61.  
  62. PRIVATE char ver[] = "$VER: SysVectors 1.0 (12/20/1999) by J.T. Steichen";
  63.  
  64. PRIVATE struct TextFont *VecFont = NULL;
  65.  
  66. PRIVATE struct Window       *VecWnd   = NULL;
  67. PRIVATE struct Gadget       *VecGList = NULL;
  68. PRIVATE struct IntuiMessage  VecMsg;
  69. PRIVATE struct Gadget       *VecGadgets[ Vec_CNT ];
  70.  
  71. PRIVATE UWORD  VecLeft   = 0;
  72. PRIVATE UWORD  VecTop    = 16;
  73. PRIVATE UWORD  VecWidth  = 635;
  74. PRIVATE UWORD  VecHeight = 230;
  75. PRIVATE UBYTE *VecWdt    = "System Vectors Info:";
  76.  
  77. PRIVATE char tstr[] = "Address     Contents    Name";
  78. PRIVATE char fmt[]  = "%08LX -> %08LX -> %-50.50s";
  79.  
  80. #define MAXNODES 15
  81.  
  82. PRIVATE struct MinList VecList;
  83.  
  84. PRIVATE struct Node VecNode;
  85. PRIVATE struct Node VecNodes[ MAXNODES ] = { NULL, };
  86.  
  87. PRIVATE UBYTE       NodeStrs[ MAXNODES * 80 ] = "";
  88.  
  89. PRIVATE UWORD VecGTypes[] = {
  90.  
  91.    LISTVIEW_KIND,   BUTTON_KIND,   BUTTON_KIND
  92. };
  93.  
  94. PRIVATE int VLVClicked(    int whichitem );
  95. PRIVATE int ClearClicked(  int dummy     );
  96. PRIVATE int CancelClicked( int dummy     );
  97.  
  98. PRIVATE struct NewGadget VecNGad[] = {
  99.  
  100.      2,   3, 627, 200,                NULL, NULL, VLV,               0, 
  101.    NULL, (APTR) VLVClicked,
  102.  
  103.    317, 205,  72,  17, (UBYTE *) "Clear",   NULL, Clear,  PLACETEXT_IN,
  104.    NULL, (APTR) ClearClicked,
  105.  
  106.    554, 205,  72,  17, (UBYTE *) "_Cancel", NULL, Cancel, PLACETEXT_IN,
  107.    NULL, (APTR) CancelClicked
  108. };
  109.  
  110. PRIVATE ULONG VecGTags[] = {
  111.  
  112.    GTLV_ShowSelected, NULL, LAYOUTA_Spacing, 2, TAG_DONE,
  113.  
  114.    GA_Disabled,     TRUE, TAG_DONE,
  115.    GT_Underscore,   '_',  TAG_DONE
  116. };
  117.  
  118. PRIVATE APTR  Vectors[ MAXNODES ] = { 0, };
  119.  
  120. PRIVATE ULONG VecAddress = 0L; // What did User click on?
  121.  
  122. // -----------------------------------------------------------------
  123.  
  124. PRIVATE void SetupVectorList( void )
  125. {
  126.    IMPORT struct ExecBase *SysBase;
  127.  
  128.    int i = 0;
  129.  
  130.    sprintf( &NodeStrs[ i++ ], "%s", &tstr[0] ); // Title of contents.
  131.       
  132.    Forbid();
  133.    
  134.       Vectors[0 ] = (APTR) SysBase->SoftVer;
  135.       Vectors[1 ] = SysBase->ColdCapture;
  136.       Vectors[2 ] = SysBase->CoolCapture;
  137.       Vectors[3 ] = SysBase->WarmCapture;
  138.       Vectors[4 ] = SysBase->DebugEntry;
  139.       Vectors[5 ] = SysBase->DebugData;
  140.       Vectors[6 ] = SysBase->TaskTrapCode;
  141.       Vectors[7 ] = SysBase->TaskExceptCode;
  142.       Vectors[8 ] = SysBase->KickMemPtr;
  143.       Vectors[9 ] = SysBase->KickTagPtr;
  144.       Vectors[10] = SysBase->KickCheckSum;
  145.  
  146.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  147.                &(SysBase->SoftVer), Vectors[0], "Software Version" 
  148.              );
  149.  
  150.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  151.                &(SysBase->ColdCapture), Vectors[1], "Cold Capture" 
  152.              );
  153.  
  154.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  155.                &(SysBase->CoolCapture), Vectors[2], "Cool Capture" 
  156.              );
  157.  
  158.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  159.                &(SysBase->WarmCapture), Vectors[3], "Warm Capture" 
  160.              );
  161.  
  162.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  163.                &(SysBase->DebugEntry), Vectors[4], "Debug Entry point" 
  164.              );
  165.  
  166.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  167.                &(SysBase->DebugData), Vectors[5], "Debug Data start" 
  168.              );
  169.  
  170.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  171.                &(SysBase->TaskTrapCode), Vectors[6], "Task Trap Code start"
  172.              );
  173.  
  174.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  175.                &(SysBase->TaskExceptCode), Vectors[7], 
  176.                "Task Exception Code start"
  177.              );
  178.  
  179.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  180.                &(SysBase->KickMemPtr), Vectors[8], "Kick Memory pointer"
  181.              );
  182.  
  183.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  184.                &(SysBase->KickTagPtr), Vectors[9], "Kick Tag pointer"
  185.              );
  186.  
  187.       sprintf( &NodeStrs[ i++ * 80 ], &fmt[0],
  188.                &(SysBase->KickCheckSum), Vectors[10], 
  189.                "Kick Memory CheckSum"
  190.              );
  191.  
  192.    Permit();
  193.  
  194.    return;
  195. }
  196.  
  197.  
  198. PRIVATE void CloseVecWindow( void )
  199. {
  200.    if (VecWnd != NULL)
  201.       {
  202.       CloseWindow( VecWnd );
  203.       VecWnd = NULL;
  204.       }
  205.  
  206.    if (VecGList != NULL)
  207.       {
  208.       FreeGadgets( VecGList );
  209.       VecGList = NULL;
  210.       }
  211.  
  212.    if (VecFont != NULL)
  213.       {
  214.       CloseFont( VecFont );
  215.       VecFont = NULL;
  216.       }
  217.  
  218.    return;
  219. }
  220.  
  221. PRIVATE int VecCloseWindow( void )
  222. {
  223.    CloseVecWindow();
  224.    return( (int) FALSE );
  225. }
  226.  
  227. PRIVATE int VLVClicked( int whichitem )
  228. {
  229.    ULONG addr = 0L;
  230.  
  231. //#  ifdef DEBUG
  232. //   fprintf( stderr, "%-80.80s\n", VecNodes[ whichitem ].ln_Name );
  233. //#  endif
  234.  
  235.    if (whichitem != 0)
  236.       {
  237.       GT_SetGadgetAttrs( VecGadgets[ Clear ], VecWnd, NULL,
  238.                          GA_Disabled, FALSE, TAG_DONE
  239.                        );
  240.  
  241.       // Now get address from the item:
  242.       (void) stch_l( VecNodes[ whichitem ].ln_Name, (long *) &addr );
  243.  
  244.       VecAddress = addr;
  245.       }
  246.    else
  247.       {
  248.       GT_SetGadgetAttrs( VecGadgets[ Clear ], VecWnd, NULL,
  249.                          GA_Disabled, TRUE, TAG_DONE
  250.                        );
  251.       
  252.       VecAddress = 0;
  253.       }
  254.  
  255.    return( (int) TRUE );
  256. }
  257.  
  258. PRIVATE int ClearAVector( ULONG vaddress )
  259. {
  260.    int rval = TRUE;
  261.  
  262.    Forbid();
  263.  
  264.       if (vaddress == (ULONG) &SysBase->SoftVer)
  265.          { 
  266.          Vectors[0]                    = 0;
  267.          *((char *) &SysBase->SoftVer) = 0;
  268.  
  269.          Permit();
  270.          }
  271.       else if (vaddress == (ULONG) &SysBase->ColdCapture)
  272.          {
  273.          Vectors[1]                        = 0;
  274.          *((char *) &SysBase->ColdCapture) = 0;
  275.  
  276.          Permit();
  277.          }
  278.       else if (vaddress == (ULONG) &SysBase->CoolCapture)
  279.          {
  280.          Vectors[2]                        = 0;
  281.          *((char *) &SysBase->CoolCapture) = 0;
  282.  
  283.          Permit();
  284.          }
  285.       else if (vaddress == (ULONG) &SysBase->WarmCapture)
  286.          {
  287.          Vectors[3]                        = 0;
  288.          *((char *) &SysBase->WarmCapture) = 0;
  289.  
  290.          Permit();
  291.          }
  292.       else if (vaddress == (ULONG) &SysBase->DebugEntry)
  293.          {
  294.          Vectors[4]                       = 0;
  295.          *((char *) &SysBase->DebugEntry) = 0;
  296.  
  297.          Permit();
  298.          }
  299.       else if (vaddress == (ULONG) &SysBase->DebugData)
  300.          {
  301.          Vectors[5]                      = 0;
  302.          *((char *) &SysBase->DebugData) = 0;
  303.  
  304.          Permit();
  305.          }
  306.       else if (vaddress == (ULONG) &SysBase->TaskTrapCode)
  307.          {
  308.          Vectors[6]                         = 0;
  309.          *((char *) &SysBase->TaskTrapCode) = 0;
  310.  
  311.          Permit();
  312.          }
  313.       else if (vaddress == (ULONG) &SysBase->TaskExceptCode)
  314.          {
  315.          Vectors[7]                           = 0;
  316.          *((char *) &SysBase->TaskExceptCode) = 0;
  317.  
  318.          Permit();
  319.          }
  320.       else if (vaddress == (ULONG) &SysBase->KickMemPtr)
  321.          {
  322.          Vectors[8]                       = 0;
  323.          *((char *) &SysBase->KickMemPtr) = 0;
  324.  
  325.          Permit();
  326.          }
  327.       else if (vaddress == (ULONG) &SysBase->KickTagPtr)
  328.          {
  329.          Vectors[9]                       = 0;
  330.          *((char *) &SysBase->KickTagPtr) = 0;
  331.  
  332.          Permit();
  333.          }
  334.       else if (vaddress == (ULONG) &SysBase->KickCheckSum)
  335.          {
  336.          Vectors[10]                        = 0;
  337.          *((char *) &SysBase->KickCheckSum) = 0;
  338.       
  339.          Permit();
  340.          }
  341.       else
  342.          {
  343.          int ans = 0;
  344.  
  345.          Permit();          
  346.  
  347.          sprintf( ErrMsg, "Unknown vector in ClearAVector()!\n"
  348.                           "Continue?" 
  349.                 );
  350.  
  351.          ans = Handle_Problem( ErrMsg, "Program ERROR!", NULL );
  352.          
  353.          if (ans != 0)
  354.             rval = FALSE;
  355.          }
  356.  
  357.    return( rval );
  358. }
  359.  
  360. PRIVATE int ClearClicked( int dummy )
  361. {
  362.    int rval = TRUE;
  363.  
  364.    if (VecAddress == 0)
  365.       {
  366.       SetReqButtons( "OKAY!" );
  367.  
  368.       (void) Handle_Problem( "Select a Vector to clear first!", 
  369.                              "User ERROR:", NULL
  370.                            );
  371.  
  372.       SetReqButtons( "CONTINUE|ABORT!" );
  373.       
  374.       return( rval );
  375.       }
  376.    else
  377.       {
  378.       int ans = 0;
  379.       
  380.       sprintf( ErrMsg, "WARNING!:  What you're about to do may\n"
  381.                        "           CRASH the Operating System!"
  382.                        "   Continue?" 
  383.              );
  384.  
  385.       ans = Handle_Problem( ErrMsg, "User Sanity Check:", NULL );
  386.  
  387.       if (ans != 0)
  388.          return( rval );
  389.       }
  390.  
  391.    // Crazy User decided to Continue!:
  392.  
  393.    HideListFromView( VecGadgets[ VLV ], VecWnd );
  394.  
  395.    rval = ClearAVector( VecAddress );
  396.    
  397.    SetupVectorList(); // Make the list.
  398.  
  399.    ModifyListView( VecGadgets[ VLV ], VecWnd, 
  400.                    (struct List *) &VecList, NULL
  401.                  );
  402.  
  403.    GT_RefreshWindow( VecWnd, NULL );
  404.  
  405.    return( rval );
  406. }
  407.  
  408. PRIVATE int CancelClicked( int dummy )
  409. {
  410.    return( VecCloseWindow() );
  411. }
  412.  
  413. // ------------------------------------------------------------------
  414.  
  415. PRIVATE int OpenVecWindow( void )
  416. {
  417.    struct NewGadget  ng;
  418.    struct Gadget    *g;
  419.    UWORD             lc, tc;
  420.    UWORD             wleft = VecLeft, wtop = VecTop, ww, wh;
  421.  
  422.    ComputeFont( Scr, Font, &CFont, VecWidth, VecHeight );
  423.  
  424.    ww = ComputeX( CFont.FontX, VecWidth );
  425.    wh = ComputeY( CFont.FontY, VecHeight );
  426.  
  427.    if ((wleft + ww + CFont.OffX + Scr->WBorRight) > Scr->Width)
  428.       wleft = Scr->Width - ww;
  429.  
  430.    if ((wtop + wh + CFont.OffY + Scr->WBorBottom) > Scr->Height)
  431.       wtop = Scr->Height - wh;
  432.  
  433.    if ((VecFont = OpenDiskFont( Font )) == NULL)
  434.       return( -5 );
  435.  
  436.    if ((g = CreateContext( &VecGList )) == NULL)
  437.       return( -1 );
  438.  
  439.    for (lc = 0, tc = 0; lc < Vec_CNT; lc++)
  440.       {
  441.       CopyMem( (char *) &VecNGad[lc], (char *) &ng, 
  442.                (long) sizeof( struct NewGadget )
  443.              );
  444.  
  445.       ng.ng_VisualInfo = VisualInfo;
  446.       ng.ng_TextAttr   = Font;
  447.  
  448.       ng.ng_LeftEdge   = CFont.OffX + ComputeX( CFont.FontX, 
  449.                                                 ng.ng_LeftEdge
  450.                                               );
  451.  
  452.       ng.ng_TopEdge    = CFont.OffY + ComputeY( CFont.FontY, 
  453.                                                 ng.ng_TopEdge
  454.                                               );
  455.  
  456.       ng.ng_Width      = ComputeX( CFont.FontX, ng.ng_Width );
  457.       ng.ng_Height     = ComputeY( CFont.FontY, ng.ng_Height );
  458.  
  459.       VecGadgets[lc] = g = CreateGadgetA( (ULONG) VecGTypes[lc], 
  460.                              g, 
  461.                              &ng, 
  462.                              (struct TagItem *) &VecGTags[tc] );
  463.  
  464.       while (VecGTags[tc] != NULL)
  465.          tc += 2;
  466.  
  467.       tc++;
  468.  
  469.       if (NOT g)
  470.          return( -2 );
  471.       }
  472.  
  473.    if ((VecWnd = OpenWindowTags( NULL,
  474.  
  475.                    WA_Left,        wleft,
  476.                    WA_Top,         wtop,
  477.                    WA_Width,       ww + CFont.OffX + Scr->WBorRight,
  478.                    WA_Height,      wh + CFont.OffY + Scr->WBorBottom,
  479.                    
  480.                    WA_IDCMP,       LISTVIEWIDCMP | BUTTONIDCMP 
  481.                      | IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW 
  482.                      | IDCMP_VANILLAKEY,
  483.  
  484.                    WA_Flags,       WFLG_DRAGBAR | WFLG_DEPTHGADGET 
  485.                      | WFLG_CLOSEGADGET | WFLG_SMART_REFRESH 
  486.                      | WFLG_ACTIVATE | WFLG_RMBTRAP,
  487.                    
  488.                    WA_Gadgets,     VecGList,
  489.                    WA_Title,       VecWdt,
  490.                    WA_ScreenTitle, ScrTitle,
  491.                    TAG_DONE )
  492.       ) == NULL)
  493.       return( -4 );
  494.  
  495.    GT_RefreshWindow( VecWnd, NULL );
  496.  
  497.    return( 0L );
  498. }
  499.  
  500. PRIVATE int VecVanillaKey( int whichkey )
  501. {
  502.    int rval = TRUE;
  503.    
  504.    switch (whichkey)
  505.       {
  506.       case 'c':
  507.       case 'C':
  508.       case 'x':
  509.       case 'X':
  510.       case 'q':
  511.       case 'Q':
  512.          rval = CancelClicked( 0 );
  513.          break;
  514.          
  515.       default:
  516.          break;
  517.       }
  518.       
  519.    return( rval );
  520. }
  521.  
  522. PRIVATE int HandleVecIDCMP( void )
  523. {
  524.    struct IntuiMessage  *m;
  525.    int                 (*func)( int code );
  526.    BOOL                  running = TRUE;
  527.  
  528.    while (running == TRUE)
  529.       {
  530.       if ((m = GT_GetIMsg( VecWnd->UserPort )) == NULL)
  531.          {
  532.          (void) Wait( 1L << VecWnd->UserPort->mp_SigBit );
  533.          continue;
  534.          }
  535.  
  536.       CopyMem( (char *) m, (char *) &VecMsg, 
  537.                (long) sizeof( struct IntuiMessage )
  538.              );
  539.  
  540.       GT_ReplyIMsg( m );
  541.  
  542.       switch (VecMsg.Class)
  543.          {
  544.          case IDCMP_REFRESHWINDOW:
  545.             GT_BeginRefresh( VecWnd );
  546.             GT_EndRefresh( VecWnd, TRUE );
  547.             break;
  548.  
  549.          case IDCMP_CLOSEWINDOW:
  550.             running = VecCloseWindow();
  551.             break;
  552.  
  553.          case IDCMP_VANILLAKEY:
  554.             running = VecVanillaKey( (int) VecMsg.Code );
  555.             break;
  556.             
  557.          case IDCMP_GADGETUP:
  558.          case IDCMP_GADGETDOWN:
  559.             func = (void *) ((struct Gadget *) VecMsg.IAddress)->UserData;
  560.             if (func != NULL)
  561.                running = func( (int) VecMsg.Code );
  562.  
  563.             break;
  564.          }
  565.       }
  566.  
  567.    return( running );
  568. }
  569.  
  570. PUBLIC int HandleVectorLV( void )
  571. {
  572.    int i = 0;
  573.    
  574.    VecNode.ln_Succ = (struct Node *) VecList.mlh_Tail;
  575.    VecNode.ln_Pred = (struct Node *) VecList.mlh_Head;
  576.    VecNode.ln_Type = 0;
  577.    VecNode.ln_Pri  = 100;
  578.    VecNode.ln_Name = &tstr[0];
  579.  
  580.    VecNodes[0] = VecNode;
  581.  
  582.    // Open Libraries, Screen & Window:
  583.    if (SetupSystemList( &OpenVecWindow ) < 0)
  584.       {
  585.       fprintf( stderr, "Couldn't open a System ListViewer!\n" );
  586.       return( -1 );
  587.       }
  588.    
  589.    SetNotifyWindow( VecWnd );
  590.  
  591.    for (i = 1; i <= MAXNODES; i++)
  592.       {
  593.       VecNodes[i].ln_Name = &NodeStrs[ i * 80 ];
  594.       VecNodes[i].ln_Pri  = MAXNODES - i;
  595.       }
  596.  
  597.    NewList( (struct List *) &VecList );      
  598.  
  599.    for (i = 0; i < MAXNODES; i++)
  600.       Enqueue( (struct List *) &VecList, &VecNodes[ i ] );
  601.  
  602.    HideListFromView( VecGadgets[ VLV ], VecWnd );
  603.  
  604.    SetupVectorList(); // Make the list.
  605.  
  606.    ModifyListView( VecGadgets[ VLV ], VecWnd, 
  607.                    (struct List *) &VecList, NULL
  608.                  );
  609.  
  610.    GT_RefreshWindow( VecWnd, NULL );
  611.  
  612.    (void) HandleVecIDCMP();
  613.    
  614.    // Close Libraries, Screen & Window:
  615.    ShutdownSystemList();
  616.  
  617.    return( 0 );
  618. }
  619.  
  620.  
  621. PUBLIC int ShowVectors( void )
  622. {
  623.    int rval = 0;
  624.  
  625.    rval = HandleVectorLV();
  626.    
  627.    return( rval );
  628. }
  629.  
  630. #ifdef DEBUG
  631.  
  632. PUBLIC int main( void )
  633. {
  634.    return( ShowVectors() );
  635. }
  636.  
  637. #endif
  638.  
  639. /* ------------------ END of SysVectors.c file! ---------------------- */
  640.